8장. 재료 고르기 — 좋은 데이터 모으기

출처: 『AI 엔지니어링』(Chip Huyen 지음, 한국어판) | 원서 8장 대응

코드는 분위기만 — Python·import 같은 말은 몰라도 됩니다. 표의 '비유'와 '위험'만 봐도 충분해요.

모델을 우리 일에 맞게 다듬으려면(파인튜닝) 가르칠 자료가 필요하다.

그 자료가 바로 데이터다.

이 장은 "어떤 데이터를 모으고, 어떻게 고르고, 어떻게 깨끗이 손질하는가" 만 다룬다.

요리로 치면 재료 고르기다.


0. 이 장의 새 단어 (0장에 없는 것만)

0장 용어집에 없는 말은 딱 세 개다.

나머지 어려운 말(파인튜닝·추론·환각 등)은 전부 0장에 있다. 막히면 0장으로 돌아가면 된다.


데이터 품질(data quality)

한 문장 뜻 — 모은 자료가 얼마나 깨끗하고 쓸 만한지의 정도.

일상비유 — 재료의 신선도. 같은 김치찌개라도 묵은 재료로 끓이면 맛이 없다. 자료도 신선해야 모델이 잘 배운다.

한 줄 예 —

# 같은 100개라도 깨끗한 100개가 더럽게 섞인 1000개보다 낫다
good = clean_examples[:100]   # 신선한 재료 100개

합성 데이터(synthetic data)

한 문장 뜻 — 진짜로 모은 게 아니라, 프로그램이나 AI가 만들어 낸 가짜 자료.

일상비유 — 모형 과일. 진짜 사과가 부족할 때 진짜처럼 생긴 모형을 더 만들어 진열대를 채우는 것. 진짜와 잘 섞어 써야 한다.

한 줄 예 —

# 진짜 자료가 모자라서 AI에게 비슷한 걸 더 만들게 시킴
fake = model.make_examples(how_many=500)  # 가짜로 500개 보충

중복 제거(deduplication)

한 문장 뜻 — 똑같은 자료가 여러 번 들어가 있으면 한 개만 남기고 지우는 일.

일상비유 — 사진첩 정리. 같은 사진이 50장 있으면 1장만 남긴다. 안 그러면 그 사진만 외운 사람이 된다.

한 줄 예 —

# 같은 예시가 여러 번 있으면 하나만 남김
unique = remove_duplicates(all_data)  # 중복 빼고 고유한 것만

(귀납 도입) 이런 적 있죠?

모델을 우리 회사 말투에 맞게 다듬으려고 데이터를 잔뜩 긁어모았다.

인터넷에서 100만 개를 모았으니 많을수록 좋겠지 싶었다.

그런데 다듬은 모델이 더 이상해졌다.

긁어온 자료에 광고 문구, 깨진 글자, 똑같은 문장이 수백 번 섞여 있었던 것이다.

# 무작정 많이 모은 데이터
data = scrape_web(count=1_000_000)
my_model = finetune(base_model, data)   # 결과: 더 나빠짐

옆 팀은 달랐다.

딱 1,000개만 골랐다.

대신 하나하나 깨끗하고, 우리 일과 딱 맞는 것만 손으로 골랐다.

그 1,000개로 다듬은 모델이 100만 개로 다듬은 우리 것보다 훨씬 잘했다.

그게 데이터 품질이다.

데이터 품질은 모은 자료가 얼마나 깨끗하고 우리 일과 잘 맞는지의 정도다.

세계 최고의 팀이라도 좋은 자료가 없으면 좋은 모델을 못 만든다.

양보다 질이다.


이 장에서 딱 3가지만

  1. 양보다 질이다. 깨끗한 1,000개가 더러운 100만 개를 이긴다. (데이터 품질)
  2. 모자라면 만들어 채운다. 진짜 자료가 부족할 때 AI로 가짜를 더 만들되, 진짜와 섞어 쓴다. (합성 데이터)
  3. 쓰기 전에 손질한다. 중복을 지우고, 더러운 것을 닦아낸다. (중복 제거)

학습 목표

이 장을 끝내면 다음을 할 수 있다.

  • 데이터는 양보다 질이 중요함을 설명한다.
  • 좋은 데이터의 조건을 구분한다.
  • 합성 데이터가 왜 필요한지 설명한다.
  • 데이터를 손질하는 순서를 구분한다.

개념 1 — 양보다 질 (데이터 품질)

망가지는 장면

자료가 많을수록 좋은 줄 알고 인터넷에서 닥치는 대로 긁어 왔다.

그 안에 광고, 깨진 글자, 우리 일과 상관없는 옛날 문서가 잔뜩 섞여 있었다.

모델은 그 쓰레기까지 그대로 배웠다.

일상비유

재료의 신선도다.

같은 찌개라도 묵은 재료 한 트럭보다, 신선한 재료 한 바구니가 더 맛있는 요리를 만든다.

자료도 양이 아니라 신선도(품질)가 맛을 정한다.

비유 코드 위험
신선한 재료 한 바구니 finetune(model, clean_1000) 안전 — 적어도 깨끗해서 잘 배움
묵은 재료 한 트럭 finetune(model, dirty_1000000) 쓰레기까지 배움 — 모델이 더 나빠짐

한 문장 정의 — 데이터 품질은 모은 자료가 얼마나 깨끗하고 우리 일과 잘 맞는지의 정도이며, 모델 성능은 자료의 양이 아니라 이 품질이 정한다.

좋은 데이터의 조건 (쉽게 6가지)

  1. 우리 일과 관련 있나 — 현재 회사 규정을 묻는데 19세기 법률 문서로 가르치면 안 된다.
  2. 시킨 모양과 맞나 — 짧게 답하길 원하는데 길고 장황한 답으로 가르치면 안 된다.
  3. 서로 안 엇갈리나 — 같은 질문에 답이 제각각이면 모델이 헷갈린다.
  4. 깨끗한 모양인가 — 깨진 글자, 쓸데없는 꼬리표 기호가 없어야 한다.
  5. 겹치지 않나 — 같은 게 수백 번 있으면 그것만 외운 모델이 된다.
  6. 민감 정보 없나 — 남의 주민번호 같은 개인 정보가 섞이면 안 된다.

예시 폭격 — 데이터 품질

예시 ① (worked-example, 완성예)

회사 챗봇을 다듬으려 한다.

잘못된 예 vs 올바른 예를 나란히 본다.

# 잘못된 예 — 양만 보고 긁어옴
data = scrape_web(count=500_000)  # 광고·깨진 글자·옛날 문서 범벅
# → 모델이 광고 말투를 배워 버림

# 올바른 예 — 우리 일과 맞는 것만 골라 손으로 다듬음
data = pick_relevant(our_chat_logs)[:1000]  # 깨끗한 우리 대화 1000개
# → 우리 말투를 정확히 배움

신선한 1,000개가 묵은 50만 개를 이긴다.

예시 ② (부분완성, 빈칸 채우기)

아래 빈칸에 들어갈 말을 생각해 보자.

# 목표: 짧고 깔끔한 답을 하는 모델
# 좋은 데이터는 _______ 답으로 채워야 한다
data = [ex for ex in all_examples if len(ex.answer) < 50]  # 빈칸: 짧은

빈칸은 "짧은" 이다.

시킨 모양(짧은 답)과 가르치는 자료의 모양이 같아야 하기 때문이다.

예시 ③ (독립적용)

상황: 의료 상담 챗봇용 자료 1만 개를 모았다.

그 안에 환자 이름과 전화번호가 그대로 들어 있다.

좋은 데이터 6조건 중 무엇을 어긴 걸까?

답: 6번 "민감 정보 없나" 를 어겼다.

개인 정보는 쓰기 전에 반드시 지워야 한다.

미니 시나리오 — 이럴 때 이렇게

"데이터가 5만 개나 있는데 모델이 안 좋아져요" → 양을 늘리기 전에, 먼저 5만 개 안에서 우리 일과 맞는 깨끗한 것만 골라낸다.

대개 양이 아니라 질이 문제다.


한 걸음 더 ▸ (지금 몰라도 됨)

"그럼 무조건 적게가 답인가요?" 는 아니다. 정말 어려운 일은 많은 자료가 필요하기도 하다.

지금은 "양부터 늘리지 말고, 질부터 챙긴다" 라는 규칙 하나만 들고 가면 된다. 균형 판단은 더 깊은 주제다.


개념 2 — 모자라면 만들어 채운다 (합성 데이터)

망가지는 장면

희귀병 진단 모델을 만들려는데, 그 병의 실제 사례가 50건뿐이었다.

진짜 자료가 턱없이 부족했다.

기다린다고 환자가 갑자기 늘어나는 것도 아니었다.

일상비유

모형 과일이다.

진짜 사과가 부족할 때, 진짜처럼 생긴 모형 사과를 더 만들어 진열대를 채운다.

자료가 부족하면 진짜처럼 생긴 가짜 자료를 만들어 채우는 게 합성 데이터다.

비유 코드 위험
진짜+모형 섞어 진열 data = real + synthetic 안전 — 부족분을 채우면서 진짜도 유지
모형만 잔뜩 진열 data = synthetic_only 진짜 감각을 잃음 — 모델이 점점 멍청해짐

한 문장 정의 — 합성 데이터는 진짜로 모은 게 아니라 프로그램이나 AI가 만들어 낸 가짜 자료이며, 진짜 자료가 부족할 때 반드시 진짜와 섞어서 보충한다.

왜 만들어서 채우나 (쉽게 3가지)

  1. 양이 모자랄 때 — 희귀병, 드문 사고처럼 진짜를 구하기 어려운 경우.
  2. 민감해서 못 쓸 때 — 진짜 의료 기록 대신 비슷하게 지어낸 가짜로 대체.
  3. 일부러 어려운 걸 만들 때 — AI가 사람보다 더 까다로운 연습 문제를 만들어 줄 수 있다.

예시 폭격 — 합성 데이터

예시 ① (worked-example, 완성예)

진짜 영어 문장 하나를 가지고 가짜를 더 만든다.

번역을 두 번 돌리는 방법이다.

# 진짜 한 문장에서 비슷한 변형을 자동으로 만듦
original = "환불은 7일 안에 가능합니다"
mid = translate(original, to="영어")       # 영어로
back = translate(mid, to="한국어")          # 다시 한국어로 → 살짝 다른 문장
# original 과 back 둘 다 학습에 쓰면 자료가 2배

이렇게 하나에서 여럿을 불려 부족분을 채운다.

예시 ② (부분완성, 빈칸 채우기)

가짜만 쓰면 안 되고, 진짜와 섞어야 한다.

빈칸을 채워 보자.

real = load_real(count=200)          # 진짜 200개
fake = model.make_examples(count=800) # 가짜 800개
data = real + ____                    # 빈칸: fake (진짜와 섞기)

빈칸은 fake 다.

진짜(real) 만 쓰면 양이 모자라고, 가짜(fake) 만 쓰면 진짜 감각을 잃기 때문에 둘을 섞는다.

예시 ③ (독립적용)

상황: 고객 불만 응대 모델을 만드는데, 화난 고객 사례가 30건뿐이다.

가짜로 보충하려 한다. 어떻게 안전하게 할까?

답: AI에게 화난 고객 말투의 예시를 더 만들게 한 뒤, 진짜 30건과 섞어서 쓴다.

가짜만 쓰지 않는 것이 핵심이다.

미니 시나리오 — 이럴 때 이렇게

"진짜 자료가 너무 적어요" → AI나 번역으로 비슷한 가짜를 만들어 보충하되, 진짜와 꼭 섞는다.

가짜만 모아 가르치면 모델이 진짜 세상을 점점 잊는다.


한 걸음 더 ▸ (지금 몰라도 됨)

"가짜만으로 가르치면 왜 나빠지나요?" — 가짜를 또 가짜로 불리기를 반복하면 모델이 드문 경우를 점점 잊어버린다. 이걸 어렵게는 '모델 붕괴' 라 부른다.

지금은 "가짜는 보충용, 진짜와 섞는다" 만 기억하면 된다.


개념 3 — 쓰기 전에 손질한다 (중복 제거와 청소)

망가지는 장면

모은 자료를 그대로 모델에 넣었다.

알고 보니 인기 있는 문장 하나가 수백 번 똑같이 들어 있었다.

모델은 그 문장만 외운 사람처럼 굴었다.

일상비유

사진첩 정리다.

여행 사진을 정리하는데 똑같은 노을 사진이 50장 있다.

1장만 남기고 지운다.

자료도 같은 게 여러 번 있으면 하나만 남긴다. 이게 중복 제거다.

비유 코드 위험
같은 사진 1장만 남김 data = remove_duplicates(raw) 안전 — 골고루 배움
같은 사진 50장 그대로 둠 data = raw 그 한 장만 외움 — 균형이 무너짐

한 문장 정의 — 중복 제거는 똑같은 자료가 여러 번 들어가 있을 때 하나만 남기고 지우는 일이며, 자료를 모델에 넣기 전 손질의 핵심 단계다.

손질 순서 (쉽게 4단계)

  1. 직접 본다 — 먼저 자료를 눈으로 훑는다. 이상한 게 없나 직접 본다.
  2. 겹친 것 지운다 — 똑같은 자료는 하나만 남긴다 (중복 제거).
  3. 더러운 것 닦는다 — 깨진 글자, 광고, 개인 정보를 지운다.
  4. 모양 맞춘다 — 가르칠 때 모양과 실제로 쓸 때 모양을 똑같이 맞춘다.

예시 폭격 — 손질

예시 ① (worked-example, 완성예)

자료를 넣기 전에 손질하는 흐름이다.

raw = load_all()                      # 1. 모은 자료
look_at(raw[:20])                     #    먼저 눈으로 훑기
data = remove_duplicates(raw)         # 2. 겹친 것 지우기
data = remove_ads_and_pii(data)       # 3. 광고·개인정보 닦기
data = fix_format(data)               # 4. 모양 맞추기

이 순서대로 손질한 자료만 모델에 넣는다.

예시 ② (부분완성, 빈칸 채우기)

손질에는 효율적인 순서가 있다.

빈칸을 채워 보자.

# 더러운 것을 먼저 버리면 지울 양이 줄어 빠르다
data = remove_dirty(raw)        # 먼저 더러운 것 버리기
data = ______(data)             # 빈칸: remove_duplicates (그다음 중복 제거)

빈칸은 remove_duplicates 다.

더러운 것을 먼저 버려 양을 줄인 뒤 중복을 지우면 더 빠르기 때문이다.

예시 ③ (독립적용)

상황: 학습 자료에서 모델이 광고 문구를 자꾸 따라 한다.

손질 4단계 중 무엇을 빠뜨린 걸까?

답: 3단계 "더러운 것 닦기" 를 빠뜨렸다.

광고 같은 군더더기를 미리 지워야 한다.

before / after — 모양 맞추기

가르칠 때 모양과 쓸 때 모양이 다르면 모델이 헷갈린다.

# before — 모양이 어긋남
# 가르칠 때: "버거 -->"   /   실제로 쓸 때: "버거"
# → 모델이 끝의 화살표를 못 찾아 이상하게 답함

# after — 모양을 똑같이 맞춤
# 가르칠 때도 "버거 -->"   /   쓸 때도 "버거 -->"
# → 모델이 헷갈리지 않음

미니 시나리오 — 이럴 때 이렇게

"자료를 넣었는데 모델이 한 가지 답만 반복해요" → 같은 자료가 여러 번 들어갔는지 의심한다.

중복부터 지운다.


한 걸음 더 ▸ (지금 몰라도 됨)

자료가 수백만 개라 일일이 비교가 힘들면, 빠르게 겹침을 찾아내는 영리한 기법들이 있다.

지금은 "넣기 전에 직접 보고, 겹친 것 지우고, 더러운 것 닦는다" 순서만 기억하면 된다.


가장 단순한 행동 규칙

자료를 모을 때는 이 한 줄만 기억하면 된다.

양부터 늘리지 말고 → 깨끗한 것만 고르고 → 모자라면 가짜로 채우되 진짜와 섞고 → 넣기 전에 손질한다.

많이가 아니라 깨끗하게, 가 핵심이다.


정리

  • 모델 성능은 자료의 양이 아니라 품질이 정한다. 깨끗한 1,000개가 더러운 100만 개를 이긴다.
  • 진짜 자료가 부족하면 AI로 가짜를 만들어 채우되, 반드시 진짜와 섞는다.
  • 모델에 넣기 전에 직접 보고, 겹친 것 지우고, 더러운 것을 닦는다.

다음 장 예고 — 다음 장에서는 다듬은 모델을 실제로 굴려 쓸 때 빠르고 싸게 굴리는 법을 본다. (지금 몰라도 됩니다 — 다음 장에서 풀려요.)

난이도
에피소드
질문
카드를 로딩 중...
답변

클릭하거나 Space를 눌러 뒤집기

0 / 0
학습 진도 0%
이동   Space 뒤집기   R 셔플